/**
YoboPlayer歌曲预读功能设计文档
设计原则是保证最快的加载下一首，表示强烈态度后推送轨迹的改变不包含在内。原因是不可能一下预读取那么多歌曲。如张含韵，张含韵，张含韵，张含韵，张含韵，元若蓝，说不喜欢张含韵后列表中的张含韵都被清除掉，此情况下是不可能取到员若蓝的。
实现方法是在notifyPlayerStart()里向SmartPlayerPool的等待加载队列里放入当前歌曲和下一首歌曲的url(之所以放入当前歌曲，是为了处理切换频道和当前频道初始化的情况)(注意SmartPlayerPool里歌曲url入队是需要先判断没有这个url的时候才做)，然后取出当前url的player(是deQueue的操作)

处理的问题是做一个消息缓冲: OnPlayerLoadResult(true,false),OnPlayerLoadInit();在addListner之前是缓冲到自己的消息队列里，在addListener函数的时候检查消息队列，然后把他门发出去

原理及约束条件：
实质是利用当前歌曲加载完毕后到当前歌曲播到放完毕前的时间来加载当前歌曲被设置时的后继歌曲 。
改变推送轨迹，切换频道不能被预先读取（实质就是不可能预读未知的歌曲,原因是不可能同时加载40个频道的歌曲）
处理流程为：
在每次notifyPlayerStart（指的是命令播放当前歌曲）的时候
1,销毁当前的plaeyr(player.dispose)，为了释放资源mc
2，添加两个url,enQueue_fileUrl,如果参数(fileUrl0,fileUrl1,其中fileUrl0是当前要播放的url,fileUrl1是cim.get2(1),就是推送轨迹中的下一首歌曲)中的fileUrl0已经有了就不要再添加了.fileUrl1是一定要添加的，（这个是出于连续几个url都相同的情况）
3,在SmartPlayerPool 的queue_Player里deQueue一个Player,看是不是符合当前url,如果不是，则销毁并取出下一个,直到找到目标歌曲为止,这个是可以保证的，因为在start的时候是至少有一个url的.
4,针对当前取出的歌曲addListerner，这个操作会把在addListenr之前的发生事件（这个是暂时存在一个消息队列里的）OnPlayerLoadResult和OnPlayerLoadInit和广播一下,
这个是也需要对下一首歌曲addListern()的,对其广播OnPlayerLoadResult,以便他被通知加载,
要注意XPlayer的start()要保证只被加载一次


5,播放当前歌曲的过程中,广播各个事件，如果加载完毕或加载失败，则开`始下一个歌曲

备注：注意在notifyStart()之后至少会有一个url的
验收条件为：
当前歌曲加载成功后就开始加载下一首。
 * 
 * 仔细分析一下此行为
*/

package kgame5.kmedia.xplayer {

public class SmartPlayerPool{
	//________________Property___________________
	//播放器的一个队列
	private var queue_Player:Array;
	//________________Method___________________
	public function SmartPlayerPool(){
		queue_Player=new Array();
	}
	
	//向player队列中添加两个url,
	//顺利运行的前提是播放a的时候b是可知的.
	public function Enqueue(urlA:String,urlB:String){
		//T.p("EnQueue:"+urlA.substr(-6,6)+" "+urlB.substr(-6,6));
		
		var pA_new:XPlayer;
		var pB_new:XPlayer;
		
		var pA_old:XPlayer=queue_Player[0];
		
		if(pA_old!=null&&pA_old.getFileUrl()==urlA){//如果这一个和播放器队列里的第2个相等，则只追加第2个fileUrl
			//T.p("只加一个的");
			
			pB_new=new MP3Player(urlB);
			
			queue_Player.push(pB_new);
			
			pA_old.addListener(pB_new);
		}else{
			//T.p("初始的2个都家");
			
			pA_new=new MP3Player(urlA);
			queue_Player.push(pA_new);
			
			pB_new=new MP3Player(urlB);
			queue_Player.push(pB_new);
			
			//这个是为了实现当前歌曲加载完毕后会通知下一个歌曲启动加载
			pA_new.addListener(pB_new);
		}
	}
	
	public function Dequeue(fileUrl:String):XPlayer{
		//T.p("Dequeue_Player:"+fileUrl.substr(-6,6));
		//出队，直到找到目标的player
		var player:XPlayer=null;
		while(queue_Player.length>0){
			player=queue_Player.shift();
			//shift被干掉之后listener自然也就没了
			
			//T.p3("查看类型"+(player instanceof MP3_XPlayer)+" "+(player instanceof XPlayer));
			//T.p3("当前长度"+queue_Player.length+" "+player.getFileUrl());
			if(player.getFileUrl()==fileUrl){
				//T.p("找到");
				return player;
			}
		}
		
		//T.p("没找到");
		//如果整个队列里没有这个player,此时整个队列已经为空了，则新建立一个返回
		player=new MP3Player(fileUrl);
		return player;
	}
}//end of class
}